//#include<stdio.h>
//int is_reverse_word(int n)
//{
//	int sum=0,tmp=n;
//	while(tmp)
//	{
//		sum=sum*10+tmp%10;
//		tmp/=10;
//	}
//	if(sum==n)
//	{
//		return 1;
//	}
//    return 0;
//}
//int main()
//{
//	int n=0,i=0;
//	scanf("%d",&n);
//	for(i=10000;i<1000000;i++)
//	{
//		int tmp=i,count=0,sum=0;
//		while(tmp)
//		{
//			sum+=tmp%10;
//			count++;
//			tmp/=10;
//		}
//		if(sum==n&&is_reverse_word(i))
//		{
//			printf("%d\n",i);
//		}
//	}
//	return 0;
//}

//#include<stdio.h>
//int main()
//{
//	int n,i,j;
//	while(scanf("%d",&n)!=EOF)
//	{
//		if(n==0)
//		{
//			break;
//		}
//		int arr[n][2];
//		for(i=0;i<n;i++)
//		{
//			for(j=0;j<2;j++)
//			{
//				scanf("%d",&arr[i][j]);
//			}
//		}
//		for(i=n-1;i>=0;i--)
//		{
//			printf("%d ",arr[i][1]-arr[i][0]+1); 
//		}
//		printf("\n");
//	}
//	return 0;
//}

//#include<stdio.h>
//int is_prime(int n)
//{
//	int i=0;
//	for(i=2;i<n;i++)
//	{
//		if(n%i==0)
//		{
//			return 0;
//		}
//	}
//	return 1;
//}
//int main()
//{
//	int N=0,i=0,j=0,m=0;
//	scanf("%d",&N);
//	int arr[1000];
//	for(i=2;i<N;i++)
//	{
//		if(is_prime(i))
//		{
//			arr[m]=i;
//			m++;
//		}
//	}
//	for(i=0;i<m;i++)
//	{
//		for(j=0;j<m;j++)
//		{
//			if(arr[i]+arr[j]==N)
//	        {	
//				printf("%d=%d+%d\n",N,arr[i],arr[j]);
//				goto end;
//			}
//		}
//	}
//	end:
//	return 0;
//}

//#include<stdio.h>
//#include<math.h>
//int main()
//{
//	long long n=111111,i=0,j=0;
//	long long ret=pow(n,3);
//	long long arr[ret];
//	for(i=1;i<ret;i+=2)
//	{
//		long long sum=0,m=0;
//		for(j=i;j<ret;j+=2)
//		{
//			sum+=j;
//			arr[m]=j;
//			if(sum==ret)
//			{
//				for(i=0;i<=m;i++)
//				{
//					printf("%lld ",arr[i]); 
//				}
//				goto end;
//			}
//			m++;
//		}
//	}
//	end:
//	return 0;
//}

#include<stdio.h>
int Fid(int n)
{
	if(n==1)
	{
		return 1;
	}
	return n*Fid(n-1);
}
int combination(int m,int n)
{
	return Fid(m)/Fid(n)*Fid(m-n);
}
int main()
{
	int m,n;
	scanf("%d %d",&m,&n);
	printf("%d",combination(m+n,n));
	return 0;
}
